回到最初,自己學pattern看的第一篇文章
<文章列表>
IT人生組文章
--9/26 : IT人的三個心理素質
http://ithelp.ithome.com.tw/question/10130061
--9/25 : 瀏覽衝量十法(完)
http://ithelp.ithome.com.tw/question/10129651
--9/24 : 連鎖效應後的反思 - 瀏覽衝量十法
http://ithelp.ithome.com.tw/question/10129219
--9/23 : 半澤直樹 - 連鎖效應後的反思
http://ithelp.ithome.com.tw/question/10128966
--9/23 : 推薦大家看半澤直樹
http://ithelp.ithome.com.tw/question/10128756
--9/22 : 不要在電梯裡面討論HTML
http://ithelp.ithome.com.tw/question/10128407
開發技術組文章
--9/26 : jQuery套件開發之(十一),plugin pattern
http://ithelp.ithome.com.tw/question/10130076
--9/25 : jQuery套件開發(十),element放入DOM相關速度測試。
http://ithelp.ithome.com.tw/question/10129658
--9/24 : jQuery套件開發(九),了解reflow的概念
http://ithelp.ithome.com.tw/question/10129232
--9/23 : jQuery套件開發(八),怎麼樣把element 放進DOM中才好呢。
http://ithelp.ithome.com.tw/question/10128771
--9/22 : jQuery套件開發(七),實作套件。
http://ithelp.ithome.com.tw/question/10128406
全列表
http://ithelp.ithome.com.tw/ironman6/player/sheephead081/alll/1
漫漫長路
不知不覺也來到了第十一天
今天,要來介紹的是
我在學寫套件之中,覺得滿重要的一篇文章
http://coding.smashingmagazine.com/2011/10/11/essential-jquery-plugin-patterns/
我們直接來了解一下它們這樣寫的用意
也請大大們指點一二
/*
這裡的; 其實真的很假會
大抵只是怕上一段程式沒有分號,會影導下面寫的東西
*/
;(function ( $, window, document, undefined ) {
    
    /*
    window document 被傳進來當作區域變數
    會稍稍加快運算
    */
    // Create the defaults once
    var pluginName = 'defaultPluginName',
        defaults = {
            propertyName: "value"
        };
    // The actual plugin constructor
    function Plugin( element, options ) {
        this.element = element;
        this.options = $.extend( {}, defaults, options) ;
        
        this._defaults = defaults;
        this._name = pluginName;
        
        this.init();
    }
    Plugin.prototype.init = function () {
        //程式,寫這邊~
    };
    $.fn[pluginName] = function ( options ) {
        return this.each(function () {
            if (!$.data(this, 'plugin_' + pluginName)) {
                $.data(this, 'plugin_' + pluginName, 
                new Plugin( this, options ));
            }
        });
    }
})( jQuery, window, document );
這篇文章,基本上算是我寫套件的啟蒙
尤其是最後這一段
    $.fn[pluginName] = function ( options ) {
        return this.each(function () {
            if (!$.data(this, 'plugin_' + pluginName)) {
                $.data(this, 'plugin_' + pluginName, 
                new Plugin( this, options ));
            }
        });
    }
首先我想聲明的是
pattern沒有萬用的,只有適不適合
在越來越了解套件之後,我才發現
這個pattern比較適合widget類的套件
甚麼意思?就是會出現一些輔助使用者、與使用者互動的元素的
這一類都算是widget類的套件。
我貼的這個,基本上只適用一個元素觸發一個widget的狀況下。
一個元素進行多次觸發
$(selector).plugin() ; //第一次
$(selector).plugin() ; //第二次
這一個pattern都是不太適合的。
此外,這一個pattern有另一個問題
就是我無法使用$(selector).plugin('method') ;
而這是一個很常見的操作
需要稍微變更一下
$.fn[pluginName] = function() {
    //處裡套件全域設定       
    args = Array.prototype.slice.call(arguments) ;
    return this.each(function() {
        if (!$.data(this, 'plugin_' + pluginName)) {
            $.data(this, 'plugin_' + pluginName, new Plugin(this, args));  //吃參數
        }
        else if ($.isFunction(Plugin.prototype[args[0]]))
        {
            $.data(this, 'plugin_' + pluginName)[args[0]](args[1]);  //吃參數
        }
        else
        {
            console.log('wrong way to use this method:' + args[0]) ;
        }
    });
}
如此一來,假定你有一個套件需要執行
$(selecotr).plugin('doSomething') ;
你只要在prototype增加一個方法即可。
    Plugin.prototype.init = function () {
        //程式,寫這邊~
    };
    
    Plugin.prototype.doSomething = function () {
        //程式,寫這邊~
    };